A instrução JOIN, como o próprio nome sugere, é usada para vincular dados de duas tabelas relacionadas por meio de um campo em comum (normalmente uma chave estrangeira), resultando em linhas que combinam dados das duas (ou mais) tabelas nas quais a junção foi realizada.
O JOIN é, sem dúvida, uma das operações mais importantes em SQL, mas também uma das mais difíceis de entender. Para ilustrar os diferentes tipos de JOIN, a imagem a seguir descreve como cada JOIN se comporta. Vamos explicar cada um com um pouco mais de detalhes:
Junção interna (Inner Join) - Interseção
Esta é a junção clássica. A junção padrão aplicada quando nenhum outro método é especificado na consulta. Ela retorna apenas as linhas onde há uma correspondência, ou seja, o valor do campo na tabela A usado para a junção corresponde ao valor do campo correspondente na tabela B.
Exemplo: retornar todos os produtos para os quais houve pelo menos um pedido nos últimos dias (a junção interna vinculará o campo do produto na tabela Pedido com a chave primária desse produto na tabela Produto).
Junção Externa à Esquerda (Left Outer Join)
Quando você deseja listar todas as linhas que possuem uma correspondência, mas também aquelas da Tabela A que não possuem correspondência. Seguindo o exemplo anterior, se você quiser listar todos os produtos com seus respectivos dados de pedido, mas também mostrar os produtos para os quais ainda não há um pedido, a solução seria realizar uma Junção Externa à Esquerda entre Produto e Pedido.
Junção externa à direita (Rigth Outer Join)
Exatamente a mesma coisa, mas ao contrário, quando você deseja listar as linhas da tabela B mesmo que elas não estejam relacionadas a nenhuma linha da tabela A. É um operador um tanto redundante, já que você poderia simplesmente inverter a ordem das tabelas na junção e usar uma junção externa à esquerda para obter o mesmo efeito. No entanto, como parte de junções múltiplas, é útil ter ambas para uma melhor compreensão da consulta.
Junção externa completa (Full Outer join) - União
Obs: Full join não é suportado pelo MySQL, porem o mesmo resultado é obtido com um union de um left join com um rigth join
É como a soma das duas anteriores. Queremos as linhas de A e B, independentemente de haver correspondência ou não (obviamente, quando houver correspondência, a consulta retornará todos os campos de A e B que especificamos; quando não houver correspondência, a consulta retornará apenas os campos de A ou B).
Outras junções possíveis